// 购物车的store模块，用来进行全局共享数据
// 初始化vuex模块
export default {
	// 为当前模块开启命名空间
	namespaced: true,
	// 模块的store数据
	// 购物车的数组，用来存储购物车中每个商品的信息对象，并且每个对象包含如下6个属性
	// {goods_id, goods_name,goods_price,goods_count,goods_samll_logo,goods_state}
	state: () => ({
		// 项目初始化时读取存储的数据,没有存的话就默认空数组字符串,然后将其转换成数组
		cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
	}),
	// 模块的mutation方法(用于修改state里的数据)
	mutations: {
		// goods是为了判断数据是否已经存在于state里面
		addToCart(state, goods) {
			console.log(goods);
			// 根据提交的商品id判断是否已经存在于购物车，如果不存在则findResult为undefined否则就是已存在
			const findResult = state.cart.find((x) => x.goods_id === goods.goods_id);
			console.log(findResult);
			if (!findResult) {
				state.cart.push(goods)
			} else {
				findResult.goods_count++
			}
			// 修改数据后调通过commit方法使用m_cart模块所提供的方法saveToStorage()将数据用具存储到本地
			this.commit('m_cart/saveToStorage')
			console.log(state.cart);
		},
		// 将数据永久存储到本地(实际开发中需要将其传递给后端)
		saveToStorage(state) {
			// uni.setStorageSync官方方法
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		},
		// 更新购物车中商品的勾选状态
		updataGoodsState(state, goods) {
			// 根据goodsid查询购物车中对应的商品信息对象
			const findResult = state.cart.find(x => x.goods_id === goods.goods_id)
			// 如果有对应的商品信息对象
			if (findResult) {
				// 就更新对应的商品信息对象并存储到本地，然后在cart.vue页面中导入mapMutations辅助函数，从而将需要的方法映射到页面中使用
				findResult.goods_state = goods.goods_state
				this.commit('m_cart/saveToStorage')
			}
		},
		// 更新购物车中商品的勾选状态
		updataGoodsCount(state, goods) {
			// 根据goodsid查询购物车中对应的商品信息对象
			const findResult = state.cart.find(x => x.goods_id === goods.goods_id)
			// 如果有对应的商品信息对象
			if (findResult) {
				// 就更新对应的商品数量对象并存储到本地，然后在cart.vue页面中导入mapMutations辅助函数，从而将需要的方法映射到页面中使用
				findResult.goods_count = goods.goods_count
				this.commit('m_cart/saveToStorage')
			}
		},
		// 根据 Id 从购物车中删除对应的商品信息
		removeGoodsById(state, goods_id) {
			// 调用数组的 filter 方法进行过滤,state里面的商品id不等于与外界传过来的id，然后新数组里保存的就是不需要被删除的商品，然后将其重新赋值给state.cart
			console.log('删除的商品id', goods_id)
			state.cart = state.cart.filter(x => x.goods_id !== goods_id)
			this.commit('m_cart/saveToStorage')
		},
		// 更新所有商品的勾选状态
		updateAllGoodsState(state, newState) {
			// 先循环所有商品的勾选状态
			state.cart.forEach(x => x.goods_state = newState)
			this.commit('m_cart/saveToStorage')
		}
	},
	// 模块的getters属性(相当于数据的包装器)
	getters: {
		// 计算商品总数量
		total(state) {
			let count = 0
			//对cart数组进行遍历,x就代表每一件商品,然后把商品的数量累加到count身上
			state.cart.forEach(x => count += x.goods_count)
			return count
		},

		// 勾选的商品的总数量
		// 先使用 filter 方法，从购物车中过滤器已勾选的商品， 再使用 reduce 方法，将已勾选的商品总数量进行累加，reduce() 的返回值就是已勾选的商品的总数量
		checkedCount(state) {
			return state.cart.filter(x => x.goods_state).reduce((total, item) => total += item.goods_count, 0)
		},
		// 计算已经勾选的商品的价格
		checkedGoodsAmount(state) {
			// 先使用 filter 方法，从购物车中过滤器已勾选的商品
			// 再使用 reduce 方法，将已勾选的商品数量 * 单价之后，进行累加
			// reduce() 的返回值就是已勾选的商品的总价
			// 最后调用 toFixed(2) 方法，保留两位小数
			return state.cart.filter(x => x.goods_state)
				.reduce((total, item) => total += item.goods_count * item.goods_price, 0)
				.toFixed(2)
		}
	}

}
